% ==================================================
% 以下是一个带外能量（OOB）能量抑制的OFDM波形设计
% ==================================================

clc; clear;

%% 参数设置
N = 64;               % IFFT 点数
K = 52;               % 有效子载波数
B = 26;               % 左右边缘保留 B 个载波（带外）
maxIter = 100;        % ADMM最大迭代次数
lambda = 1e-2;        % 包络控制权重
rho = 1;              % ADMM 罚因子

%% 初始化频域恒模符号 (QPSK)
X = zeros(N,1);
validIdx = [(N-K)/2+1:(N+K)/2];  % 中间 K 个子载波有效
X(validIdx) = exp(1j*2*pi*rand(K,1));  % QPSK-like恒模

%% 初始时域波形
x = ifft(X);

%% ADMM 初始化
z = x;      % 变量z用于 enforcing envelope
u = zeros(N,1);  % 对偶变量

%% 频域掩码矩阵（带外能量惩罚）
W = ones(N,1);
W(validIdx) = 0;  % 抑制带外能量

figure;

%% ADMM 迭代
for iter = 1:maxIter
    % Step 1: 更新 x （频域保持恒模，时域靠近 z - u）
    x_temp = z - u;
    X_temp = fft(x_temp);
    X_new = zeros(N,1);
    X_new(validIdx) = exp(1j*angle(X_temp(validIdx)));  % 恒模更新
    x = ifft(X_new);

    % Step 2: 更新 z （逼近恒包络 + 带外能量抑制）
    z_old = z;
    z = (rho*x + u) ./ (rho + lambda);

    % Step 3: 对偶变量更新
    u = u + (x - z);

    % Step 4: 可视化每10步
    if mod(iter,10)==0
        clf;
        subplot(2,1,1);
        plot(abs(z), 'b.-'); title(['时域包络 - Iter ' num2str(iter)]);
        ylim([0 2]);
        subplot(2,1,2);
        Zf = fft(z);
        semilogy(20*log10(abs(Zf)), 'r'); title('频谱 (dB)');
        hold on;
        yline(-40, '--k'); ylim([-80 10]);
        drawnow;
    end
end

%% 输出结果
disp('ADMM 优化完成。');